#ifndef SCROLLINGLABEL_H
#define SCROLLINGLABEL_H

#include <QLabel>
#include <QTimer>
#include <QPropertyAnimation>
#include <QResizeEvent>

/**
 * @class ScrollingLabel
 * @brief 一个支持多种滚动效果的文本标签控件，支持动态调整滚动速度和字体大小。
 *
 * ScrollingLabel 提供了以下特性：
 * - 支持五种滚动类型：从左到右、从右到左、中心向两侧、两侧向中心、垂直滚动。
 * - 动态调整字体大小以适配窗口大小。
 * - 支持设置滚动速度（以像素/秒为单位）。
 */
class ScrollingLabel : public QLabel
{
    Q_OBJECT

    /**
     * @brief 滚动偏移量，用于控制文本的当前位置。
     */
    Q_PROPERTY(int scrollOffset READ scrollOffset WRITE setScrollOffset)

    /**
     * @brief 可见字符长度，用于控制逐渐显示的效果。
     */
    Q_PROPERTY(int visibleTextLength READ visibleTextLength WRITE setVisibleTextLength NOTIFY visibleTextLengthChanged)

public:
    /**
     * @enum ScrollType
     * @brief 定义滚动类型。
     */
    enum ScrollType {
        LeftToRight,    ///< 从左到右滚动
        RightToLeft,    ///< 从右到左滚动
    };

    /**
     * @brief 构造函数。
     * @param parent 父控件
     */
    explicit ScrollingLabel(QWidget *parent = nullptr);

    /**
     * @brief 析构函数。
     */
    ~ScrollingLabel() = default;

    /**
     * @brief 设置显示的文本。
     * @param text 要显示的文本内容
     */
    void setScrollText(const QString &text);

    /**
     * @brief 设置滚动类型。
     * @param type 滚动类型
     */
    void setScrollType(ScrollType type);

    /**
     * @brief 开始滚动动画。
     */
    void startScrolling();

    /**
     * @brief 停止滚动动画。
     */
    void stopScrolling();

    /**
     * @brief 获取当前滚动偏移量。
     * @return 当前偏移量
     */
    int scrollOffset() const;

    /**
     * @brief 设置滚动偏移量。
     * @param offset 偏移量
     */
    void setScrollOffset(int offset);

    /**
     * @brief 获取当前可见字符的长度。
     * @return 当前可见字符数
     */
    int visibleTextLength() const;

    /**
     * @brief 设置可见字符的长度。
     * @param length 可见字符数
     */
    void setVisibleTextLength(int length);

    /**
     * @brief 设置滚动速度。
     * @param speed 滚动速度（像素/秒）
     */
    void setScrollSpeed(int speed);

protected:
    /**
     * @brief 窗口大小调整事件。
     * @param event 窗口大小调整事件
     */
    void resizeEvent(QResizeEvent *event) override;

    /**
     * @brief 绘制事件，用于绘制文本。
     * @param event 绘制事件
     */
    void paintEvent(QPaintEvent *event) override;

signals:
    /**
     * @brief 当可见字符数变化时发出。
     */
    void visibleTextLengthChanged();

private:
    int m_visibleTextLength = 0;     ///< 当前显示的字符数
    QString m_text;                  ///< 要显示的文本内容
    ScrollType m_scrollType;         ///< 当前滚动类型
    int m_scrollOffset;              ///< 当前滚动偏移量
    QTimer *m_delayTimer;            ///< 控制滚动暂停的定时器
    QPropertyAnimation *m_animation;///< 滚动动画对象
    int m_textWidth;                 ///< 文本的总宽度（像素）
    int m_scrollSpeed = 50;          ///< 滚动速度（默认50像素/秒）

    /**
     * @brief 更新字体大小，使其适配控件大小。
     */
    void updateFontSize();

    /**
     * @brief 配置滚动动画。
     */
    void setupAnimation();

    /**
     * @brief 动画结束后重新启动动画。
     */
    void restartAnimation();
};

#endif // SCROLLINGLABEL_H
